package arithmetic.LeetCode;

import java.util.HashSet;
import java.util.List;

import com.google.common.collect.Lists;

/**
 * https://leetcode.cn/problems/word-break/description/?envType=study-plan-v2&envId=top-100-liked
 * 动态规划
 * 139. 单词拆分
 * 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
 * 注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。
 *
 * 示例 1：
 *
 * 输入: s = "leetcode", wordDict = ["leet", "code"]
 * 输出: true
 * 解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
 * 示例 2：
 *
 * 输入: s = "applepenapple", wordDict = ["apple", "pen"]
 * 输出: true
 * 解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
 *      注意，你可以重复使用字典中的单词。
 * 示例 3：
 *
 * 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
 * 输出: false
 *
 * @author jiangfeng on 2023/12/22
 */
public class wordBreak {
    public static void main(String[] args) {
//        System.out.println(new Solution().wordBreak("leetcode", Lists.newArrayList("leet","code")));
//        System.out.println(new Solution().wordBreak("a", Lists.newArrayList("a")));
        System.out.println(new Solution().wordBreak("aaaaaaa", Lists.newArrayList("aaaa","aaa")));
    }
    static class Solution{
        public boolean wordBreak(String s, List<String> wordDict) {
            // dp[i] 表示到第i个字符 有没有可以拼接上的
            boolean[] dp = new boolean[s.length()+1];
            dp[0]=true;
            HashSet<String> set = new HashSet(wordDict);
            for(int i =1;i<=s.length();i++){
                if(!dp[i-1]){
                    continue;
                }
                for(int j =i;j<=s.length();j++){
                    String ss = s.substring(i-1,j);
                    dp[j]=dp[j]||set.contains(ss)&&dp[i-1];
                }
            }
            return dp[s.length()];

        }
    }
}
